/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pio.action.aspirante;

import DBMS.DataBaseManager;
import Negocio.Negocio;
import clases.Aspirante;
import clases.Carrera;
import clases.Fecha;
import clases.Institucion;
import clases.InstitucionAspirante;
import clases.Parada;
import clases.Periodo;
import clases.Preinscrito;
import clases.Turno;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author tamerdark
 */
public class Validar extends org.apache.struts.action.Action {

    private final static String PROMEDIO_ACEPTADO = "promedioAceptado";
    private final static String PROMEDIO_RECHAZADO = "promedioRechazado";
    private final static String PERIODO_ANTES = "periodoAntes";
    private final static String PERIODO_DESPUES = "periodoDespues";
    private final static String RECHAZADO = "rechazado";
    private final static String ESPERAR_RESULTADO = "esperarResultado";
    private final static String APROBADO = "aprobado";
    private final static String ERROR = "error";

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // if today < fechaInicioPreinscripcion ==> return PERIODO_ANTES
        // if today > fechaCierrePreinscripcion 
        //  ==> if datosCompletos && today < fechaResultado 
        //      ==> return ESPERAR_RESULTADO
        //      if datosCompeltos  && today>= fechaResultado
        //          if aprobado ==> return APROBADO
        //          else ==> return rechazado
        //      if !datosCompletos ==> return PERIODO_DESPUES
        // else 
        //      if promedioRechazado ==>  return PROMEDIO_RECHAZADO
        //      else
        //          if datosCompletos ==> return ESPERAR_RESULTADO
        //          else ==> return PROMEDIO_ACEPTADO
        Aspirante a = (Aspirante) form;
        HttpSession s = request.getSession();
        a.setDatosCompletos(null);
        DataBaseManager dbms = DataBaseManager.getInstance();
        List<Periodo> pl = dbms.consultarPeriodo(new Periodo());
        Periodo p = (pl.size() > 0 ? pl.get(0) : null);
        ArrayList<InstitucionAspirante> instu = dbms.consultarAspirantes(a);
        InstitucionAspirante i = (instu.size() > 0 ? instu.get(0) : null);
        if (i == null) {
            System.out.println("Error consultando aspirante");
            return mapping.findForward("error");
        }
        a = (i.getAspirantes() != null && i.getAspirantes().size() > 0
                ? i.getAspirantes().get(0) : null);
        if (p == null || a == null) {
            System.out.println("Error consultando periodo o aspirante");
            return mapping.findForward("error");
        } else {
            int fecha = Fecha.compararFechas(p.getFechaInicioPreinscripcion(), p.getFechaCierrePreinscripcion());
            System.out.println("Comparando fechas "+ p.getFechaInicioPreinscripcion()+ "  " + p.getFechaCierrePreinscripcion() );
            if (fecha < 0) {
                s.invalidate();
                System.out.println(PERIODO_ANTES);
                return mapping.findForward(PERIODO_ANTES);
            }
            if (fecha > 0) { // El rol es nulo o es valido.
                System.out.println("Voy a comparar hoy con la fecha de publicacion "
                        + "de resultados "
                        + p.getFechaPublicacionResultadosVocacional());
                fecha = Fecha.compararFechas(p.getFechaPublicacionResultadosVocacional());
                if (a.getDatosCompletos() && fecha < 0) {
                    System.out.println(ESPERAR_RESULTADO);
                    s.invalidate();
                    return mapping.findForward(ESPERAR_RESULTADO);
                }
                System.out.println("Consultando si los datos estan completos");
                if (a.getDatosCompletos() && fecha >= 0) {
                    if (Negocio.testAprobado(a)) {
                        System.out.println("El aspirante"+ a.getCedula()+ "Tiene test aprobado");
                        System.out.println(APROBADO);
                        Preinscrito pre = new Preinscrito();
                        pre.setCedula(a.getCedula());
                        pre = dbms.consultarPreinscritos(pre).get(0);
                        request.setAttribute("Preinscrito", pre);
                        for (Turno t : dbms.consultarTurno(new Turno())) {
                            if (t.getId() == pre.getTurnoPrueba()) {
                                request.setAttribute("Turno", t);
                                break;
                            }
                        }
                        for (Institucion insti : dbms.consultarInstitucion(new Institucion())) {
                            if (pre.getInstitucionId() == insti.getId()) {
                                for (Parada pa : dbms.consultarParada(new Parada())) {
                                    if (insti.getIdParada() == pa.getId()) {
                                        System.out.println("aki toy");
                                        request.setAttribute("Parada", pa);
                                        break;
                                    }
                                }
                                request.setAttribute("Institucion", insti);
                                break;
                            }
                        }
                        return mapping.findForward(APROBADO);
                    } else {
                        s.invalidate();
                        System.out.println(RECHAZADO);
                        return mapping.findForward(RECHAZADO);
                    }
                }
                if (!a.getDatosCompletos()) {
                    s.invalidate();
                    System.out.println(PERIODO_DESPUES);
                    return mapping.findForward(PERIODO_DESPUES);
                }
            } else {
                if (!Negocio.promedioAprobado(a)) {
                    s.invalidate();
                    System.out.println(PROMEDIO_RECHAZADO);
                    return mapping.findForward(PROMEDIO_RECHAZADO);
                } else {
                    fecha = Fecha.compararFechas(p.getFechaPublicacionResultadosVocacional());
                    if (a.getDatosCompletos() && fecha < 0) {
                        System.out.println(ESPERAR_RESULTADO);
                        s.invalidate();
                        return mapping.findForward(ESPERAR_RESULTADO);
                    }
                    System.out.println("Consultando si los datos estan completos");
                    if (a.getDatosCompletos() && fecha >= 0) {
                        System.out.println("aki toy2");
                        if (Negocio.testAprobado(a)) {
                            System.out.println(APROBADO);
                            Preinscrito pre = new Preinscrito();
                            pre.setCedula(a.getCedula());
                            pre = dbms.consultarPreinscritos(pre).get(0);
                            request.setAttribute("Preinscrito", pre);
                            for (Turno t : dbms.consultarTurno(new Turno())) {
                                if (t.getId() == pre.getTurnoPrueba()) {
                                    request.setAttribute("Turno", t);
                                    break;
                                }
                            }
                            for (Institucion insti : dbms.consultarInstitucion(new Institucion())) {
                                if (pre.getInstitucionId() == insti.getId()) {
                                    for (Parada pa : dbms.consultarParada(new Parada())) {
                                        if (insti.getIdParada() == pa.getId()) {
                                            System.out.println("aki toy2");
                                            request.setAttribute("Parada", pa);
                                            break;
                                        }
                                    }
                                    request.setAttribute("Institucion", insti);
                                    break;
                                }
                            }
                            return mapping.findForward(APROBADO);
                        } else {
                            s.invalidate();
                            System.out.println(RECHAZADO);
                            return mapping.findForward(RECHAZADO);
                        }
                    } else {
                        System.out.println(PROMEDIO_ACEPTADO);
                        return mapping.findForward(PROMEDIO_ACEPTADO);
                    }
                }
            }
        }
        System.out.println("Llego al final");
        return mapping.findForward(ERROR);
    }
}
